package com.xdhl.fu.fim.price.strategy;

import com.xdhl.fu.common.core.constant.flightinfo.FlightInfoConstants;
import com.xdhl.fu.common.core.utils.MathUtils;
import com.xdhl.fu.common.core.utils.StringUtils;
import com.xdhl.fu.common.redis.service.RedisService;
import com.xdhl.fu.flight.info.api.domain.FlightInfo;
import com.xdhl.fu.flight.info.api.domain.FlightSchedule;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 布伦特原油价格变动策略
 * 机票标准价格 = 国际布伦特原油价格 * 美元兑换人民币汇率 / 1000 * 1 * 两地距离
 *
 * @author 朱力维
 * @time 2022/6/1 20:31
 */
@Component
public class BrentCrudeEffectPriceStrategy implements PriceCalcStrategy {

    // [0]为经济舱；[1]为商务舱；[2]为头等舱
    public static final String CONFIG_KEY[] = {
            "sys_config:kilometre.price.economy.coefficient",
            "sys_config:kilometre.price.business.coefficient",
            "sys_config:kilometre.price.head.coefficient"
    };

    @Resource
    private RedisService redisService;

    @Override
    public int order() {
        return 0;
    }

    @Override
    public PriceCalcStrategy calcEconomy(FlightInfo flightInfo, FlightSchedule schedule) {
        // 获取缓存中的布伦特原油价格
        String brent = redisService.getStringValue(FlightInfoConstants.BRENT_CRUDE_PRICE_CONFIG_NAME);
        // 获取美元兑换人民币汇率
        String rate = redisService.getStringValue(FlightInfoConstants.DOLLARS_TO_CNYUAN_RATE);
        if (StringUtils.isNotBlank(brent) && StringUtils.isNotBlank(rate)) {
            // 获取每公里价格计算系数
            String coefficient = redisService.getStringValue(CONFIG_KEY[0]).split("\"")[1];
            // 进行价格计算
            Double price = MathUtils.priceMultip(MathUtils.priceMultip(MathUtils.priceDivide(
                    MathUtils.priceMultip(Double.parseDouble(brent), Double.parseDouble(rate)),
                    1000D), Double.valueOf(coefficient)), flightInfo.getDistance().doubleValue());
            schedule.setEconomyPrice(price);
        }
        return this;
    }

    @Override
    public PriceCalcStrategy calcBusiness(FlightInfo flightInfo, FlightSchedule schedule) {
        // 获取缓存中的布伦特原油价格
        String brent = redisService.getStringValue(FlightInfoConstants.BRENT_CRUDE_PRICE_CONFIG_NAME);
        // 获取美元兑换人民币汇率
        String rate = redisService.getStringValue(FlightInfoConstants.DOLLARS_TO_CNYUAN_RATE);
        if (StringUtils.isNotBlank(brent) && StringUtils.isNotBlank(rate)) {
            // 获取每公里价格计算系数
            String coefficient = redisService.getStringValue(CONFIG_KEY[1]).split("\"")[1];
            // 进行价格计算
            Double price = MathUtils.priceMultip(MathUtils.priceMultip(MathUtils.priceDivide(
                    MathUtils.priceMultip(Double.parseDouble(brent), Double.parseDouble(rate)),
                    1000D), Double.valueOf(coefficient)), flightInfo.getDistance().doubleValue());
            schedule.setBusinessPrice(price);
        }
        return this;
    }

    @Override
    public PriceCalcStrategy calcHeader(FlightInfo flightInfo, FlightSchedule schedule) {
        // 获取缓存中的布伦特原油价格
        String brent = redisService.getStringValue(FlightInfoConstants.BRENT_CRUDE_PRICE_CONFIG_NAME);
        // 获取美元兑换人民币汇率
        String rate = redisService.getStringValue(FlightInfoConstants.DOLLARS_TO_CNYUAN_RATE);
        if (StringUtils.isNotBlank(brent) && StringUtils.isNotBlank(rate)) {
            // 获取每公里价格计算系数
            String coefficient = redisService.getStringValue(CONFIG_KEY[2]).split("\"")[1];
            // 进行价格计算
            Double price = MathUtils.priceMultip(MathUtils.priceMultip(MathUtils.priceDivide(
                    MathUtils.priceMultip(Double.parseDouble(brent), Double.parseDouble(rate)),
                    1000D), Double.valueOf(coefficient)), flightInfo.getDistance().doubleValue());
            schedule.setHeadPrice(price);
        }
        return this;
    }

    @Override
    public boolean enable(FlightInfo flightInfo, FlightSchedule schedule) {
        return true;
    }

}
